为了重构项目的css代码,先体验了
less
,但发现less不能满足我的需求,没办法转为sass
,在此描述一下自我感受这两者的区别。我描述的只是我直观使用的部分,大部分的不同点百度一下,第一页的全一样。。。
判断条件的区别(感觉最重要的地方)
less
写mixin
时判断的唯一关键字就是when
,而我需要生成复合样式中的一部分,像这样:1
2
3
4a{
border-right:1px;
border-bottom:2px;
}
要选择性的生成部分属性,less
很不方便,可以参考前面一篇文章less实战全解之复合样式mixin
sass
的判断关键字很符合我们的习惯@if
、@else
、@else if
,还有其他的@for
、@each
,非常强大。额…有点跑题,继续。那么用sass
处理符合属性可以写成这样,不会生成多余的属性:1
2
3
4
5
6
7
8@mixin position($position,$top:null,$right:null,$bottom:null,$left:null,$z-index:null){
position: $position;
@if $top{top: $top;}
@if $right{right: $right;}
@if $bottom{bottom: $bottom;}
@if $left{left: $left;}
@if $z-index{z-index: $z-index;}
}
假设要编译成这样的css:
1 | position: absolute; |
使用的方式有两种:
1 | //方法1,最后一个"有效参数"前面的参数设为null,后面的不用管,因为参数默认值就是null |
而且像sass
写的这种:支持多属性的0%和100%
1 | @mixin frames($props,$starts,$ends){ |
less
由于缺少for
这种关键字,只能通过递归实现循环,要实现上面的效果,想想就醉了
import
的路径问题
less
:可以使用相对路径和绝对路径,可以参考前面的文章sass
:可以使用相对路径,绝对路径好像不可以,我尝试了很多次,依旧不行,不知道是不是我尝试的有问题,请知道的前辈告诉我。语法没有less
的小括号,如下:1
@import "../../furnace/sass/_base";
使用mixin
less
:只能放在选择器内,不能放在外面,以至于我只能这样定义一个动画,而不能使用公共mixin定义动画1
2
3
4
5
6
7.blink {
.animation(blink 1.8s infinite);
}
@-webkit-keyframes blink {.keyframes-opacity(10,0);}
@-moz-keyframes blink {.keyframes-opacity(10,0);}
@-o-keyframes blink {.keyframes-opacity(10,0);}
@keyframes blink {.keyframes-opacity(10,0);}sass
:可以放在外面,然后代码就变成了这样:1
2
3
4.blink {
@include animation(blink 1.8s infinite);
}
@include keyframes-opacity(blink);
是不是简练了很多?
内部函数
编译
grunt插件编译
很多人选择用less
是因为用sass
是基于ruby
的,所以选择了less
,我在使用的过程中用了这样两个插件,都是grunt
的,gulp
当然也有。下面我的两个插件:
此处不使用grunt官方团队的grunt-contrib-sass,因为它需要ruby环境的支持
使用grunt-sass
,就不需要安装ruby环境了,因为它是用node-sass编译的,只需要用npm
安装了node-sass
就可以编译了。这是我的Gruntfile.js
:
1 | grunt.initConfig({ |
命令行使用:
1 | grunt watch |
js编译,方便调试
less
是基于JavaScript,所以,是在客户端处理的。官方提供了less.js
文件,放在html里直接就可以编译,很方便.sass
是基于服务端的,但有牛人创造了sass.js,主要由:sass.js
、sass.work.js
和sass.sync.js
组成。如果你的浏览器支持h5的 Web Worker,请使用sass.js
和sass.work.js
,我这儿就用的这两个文件。如果不支持,就使用sass.js
和sass.sync.js
。使用如下:
(1)直接在html中使用sass.js
1 | <html xmlns="http://www.w3.org/1999/xhtml"> |
(2)在对应的模块js中使用
我们使用了sea.js
来模块化,本来官方介绍是简单的require
之后就可以使用,官方demo:
1 | define(function defineSassModule(require) { |
但是在我的项目里并不成功,提示require
返回的对象是underfined
,注意到了sass.js
里面的这段代码:
1 | (function (root, factory) { |
所以,require
之后的对象被绑定到了window上,于是,代码修改为:
1 | define(function(require, exports, module) { |
然后在浏览器中开心的调试sass
吧…
最终,我还是比较喜欢sass。最后放个我总结的sass使用规范和_base.scss: